#ifndef _CHECK_SUM_
#define _CHECK_SUM_

#define MAX_STRONG_SUM_LENGTH 32

#include "src\blake2\blake2.h"
#include "src\rollsum.h"

typedef uint32_t weak_sum_t;
typedef unsigned char strong_sum_t[MAX_STRONG_SUM_LENGTH];

struct strong_sum_t2 {
  strong_sum_t sum;
};

bool operator<(const strong_sum_t2& l, const strong_sum_t2& r) {
  for (int i = 0; i < MAX_STRONG_SUM_LENGTH; i++) {
    if (l.sum[i] < r.sum[i]) {
      return true;
    } else if (l.sum[i] > r.sum[i]) {
      return false;
    }
  }
  return false;
}


weak_sum_t weak_sum(void const *buf, size_t len) {
  Rollsum sum;

  RollsumInit(&sum);
  RollsumUpdate(&sum,(const unsigned char *) buf, len);
  return RollsumDigest(&sum);
}

void blake2_sum(void const * buf, size_t len, strong_sum_t *sum) {
  blake2b_state ctx;
  blake2b_init(&ctx, MAX_STRONG_SUM_LENGTH);
  blake2b_update(&ctx, (const uint8_t *)buf, len);
  blake2b_final(&ctx, (uint8_t *)sum, MAX_STRONG_SUM_LENGTH);
}



#endif
